package com.tangruojie;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.apache.log4j.helpers.LogLog;
import org.junit.Test;

/**
 * Loggers 产生日志 → Appenders 决定日志输出到哪里 → Layout 决定日志输出的格式
 * 组件名	    类别	        关键功能	        示例
 * Logger	    日志源	    设定日志级别	    Root、Logger name="com.example"
 * Appender	    日志输出器	决定输出到哪	    Console、File、RollingFile
 * Layout	    格式化器	    决定输出格式	    PatternLayout、JSONLayout
 * ------
 * Logger 的名称（name）具有层级结构，反映包或类的结构，并且支持继承配置
 * 方面	        说明
 * 命名方式	    通常按包名或类名组织，如 com.xxx.abc
 * 层级结构	    名称具有分层结构，支持继承父级 Logger 的设置
 * 应用场景	    精细控制：根 Logger 设为 ERROR，某个子包设为 DEBUG
 */
public class Log4jTest {

    /**
     * 快速入门
     */
    @Test
    public void testQuick() {
        /**
         * 开启 log4j 内置日志记录
         */
        LogLog.setInternalDebugging(true);
        /**
         * 初始化配置信息（在入门案例中暂不使用配置文件）
         * 引入了 Log4j 1.x，而且没有提供 log4j.properties 或 log4j.xml 配置文件，导致系统无法初始化默认的日志输出器（appender），所以打印出警告
         * void configure() {
         *     Logger root = Logger.getRootLogger();
         *     root.addAppender(new ConsoleAppender(
         *            new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN)));
         *   }
         */
//        BasicConfigurator.configure(); // 注释后使用配置文件
        /**
         * 获取日志记录器对象 Log4jTest.class
         */
        Logger logger = Logger.getLogger(Log4jTest.class);
        /**
         * 日志记录输出
         */
        logger.info("hello log4j");
        /**
         * 日志级别
         * 行	等级	    说明
         * 1	FATAL	致命错误，系统可能崩溃或立即终止。
         * 2	ERROR	错误级别，程序出错但还能继续运行。
         * 3	WARN	警告，程序可能有潜在风险或边界情况。
         * 4	INFO	常规信息，比如启动完成、用户登录等。
         * 5	DEBUG	调试级别信息，帮助开发者排查逻辑。
         * 6	TRACE	最详细的信息，跟踪程序的每一步执行。
         */
        logger.fatal("fatal");
        logger.error("error");
        logger.warn("warn");
        logger.info("info");
        logger.debug("debug");
        logger.trace("trace");
        /**
         * 日志记录器对象 Logger.class
         */
        Logger loggerLogger = Logger.getLogger(Logger.class);
        loggerLogger.fatal("fatal logger");
        loggerLogger.error("error logger");
        loggerLogger.warn("warn logger");
        loggerLogger.info("info logger");
        loggerLogger.debug("debug logger");
        loggerLogger.trace("trace logger");
    }

}
